目录
Qt关于遇到0x00提前结束的问题
假如有如下一个文件,数据中包含大量的0x00
![](https://img-blog.csdnimg.cn/20210223145851336.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI2Nzg4NDc3,size_16,color_FFFFFF,t_70)
1、使用QFile读取文件
QFile firmwarefile(filePath);
firmwarefile.open(QIODevice::ReadOnly);
//方法1:全部读取
QByteArray ba = firmwarefile.readAll(); //正确
//方法2:读一行,指定长度
char buf[1024];
qint64 lineLength;
lineLength = firmwarefile.readLine(buf, sizeof(buf)); //正确,此时不要debug看buf里面的数据,因为0x00的存在,在debug中只能看到前两个字节
//方法3:读指定长度到缓冲区
int num = 1024*1;//每次读取固件大小
char *sendBuffer=new char[num]();
lineLength = firmwarefile.read(sendBuffer, num); //正确,此时不要debug看sendBuffer里面的数据,因为0x00的存在,在debug中只能看到前两个字节
delete [] sendBuffer;
firmwarefile.close();
2、使用FILE读取文件
QFileInfo fileInfo = QFileInfo(filePath);
QString fileName = fileInfo.fileName();
std::string str = filePath.toStdString();
FILE *fp;
fopen_s(&fp, str.c_str(), "r");
char *dataBuffer = new char[fileInfo.size()]();
fread(dataBuffer, fileInfo.size(), 1, fp); //正确,此时不要debug看dataBuffer里面的数据,因为0x00的存在,在debug中只能看到前两个字节
delete [] dataBuffer;
fclose(fp);
3、QByteArray转char *
如果将文件数据读取到了QByteArray中,需要将QByteArray的数据取出时,可以采用如下两种方法
方法1:
QByteArray ba = firmwarefile.readAll();
char *dataBuffer = new char[ba.size()]();
memcpy(dataBuffer, ba.data(), ba.size());
qDebug() |